/**
 ******************************************************************************
 * @file           : bsp_tim_capture.h
 * @brief          : Timer Input Capture Driver Header File
 ******************************************************************************
 * @attention
 *
 * 定时器输入捕获驱动程序头文件
 * 支持高级定时器（TIM1, TIM8）和通用定时器（TIM2-5）的输入捕获功能
 * 提供频率测量、占空比测量、PWM输入等功能
 *
 * 适配平台：STM32F1xx
 *
 ******************************************************************************
 */

/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __BSP_TIM_CAPTURE_H
#define __BSP_TIM_CAPTURE_H

#ifdef __cplusplus
extern "C" {
#endif

/* Includes ------------------------------------------------------------------*/
#include <stdint.h>
#include "stm32f1xx.h"

/* ============================================================================ */
/*                          配置宏定义（用户可修改）                             */
/* ============================================================================ */

/* 定时器选择（只能选择一个）*/
//#define TIM_CAP_USE_TIM1                              /*!< 使用TIM1（高级定时器） */
//#define TIM_CAP_USE_TIM2                              /*!< 使用TIM2（通用定时器） */
//#define TIM_CAP_USE_TIM3                              /*!< 使用TIM3（通用定时器） */
//#define TIM_CAP_USE_TIM4                              /*!< 使用TIM4（通用定时器） */
#define TIM_CAP_USE_TIM5                                /*!< 使用TIM5（通用定时器） */
//#define TIM_CAP_USE_TIM8                              /*!< 使用TIM8（高级定时器，部分型号） */

/* 捕获通道选择 */
#define TIM_CAP_CHANNEL                 TIM_CHANNEL_2   /*!< 捕获通道（1-4） */

/* 捕获模式选择 */
#define TIM_CAP_MODE_FREQ               1               /*!< 频率测量模式 */
#define TIM_CAP_MODE_DUTY               0               /*!< 占空比测量模式 */

/* 功能参数配置 */
#define TIM_CAP_TIMER_CLOCK             72000000        /*!< 定时器时钟(Hz) */
#define TIM_CAP_TIMEOUT_MS              100             /*!< 超时时间（ms），超时后频率清零 */

/* ============================================================================ */
/*                          类型定义                                            */
/* ============================================================================ */

/* Exported types ------------------------------------------------------------*/
/**
 * @brief 输入捕获错误码枚举
 */
typedef enum
{
    TIM_CAP_OK = 0,                /*!< 成功 */
    TIM_CAP_ERROR_PARAM,           /*!< 参数错误 */
    TIM_CAP_ERROR_HAL,             /*!< HAL库错误 */
    TIM_CAP_ERROR_NOT_INIT         /*!< 未初始化 */
} TIM_CAP_Error_e;

/**
 * @brief 输入捕获模式枚举
 */
typedef enum
{
    TIM_CAP_MODE_FREQUENCY = 0,    /*!< 频率测量模式 */
    TIM_CAP_MODE_PWM_INPUT         /*!< PWM输入模式（同时测量频率和占空比） */
} TIM_CAP_Mode_e;

/**
 * @brief 输入捕获数据结构体
 */
typedef struct
{
    volatile uint32_t freq;         /*!< 频率（Hz） */
    volatile uint32_t duty;         /*!< 占空比（0-10000，表示0.00%-100.00%） */
    volatile uint32_t period;       /*!< 周期（定时器计数值） */
    volatile uint8_t  updated;      /*!< 数据更新标志：0=无新数据，1=有新数据 */
} TIM_CAP_Data_t;

/* Exported constants --------------------------------------------------------*/
/* Exported macro ------------------------------------------------------------*/
/* Exported variables --------------------------------------------------------*/
extern TIM_HandleTypeDef g_tim_cap_handle;              /* 输入捕获定时器句柄 */

/* Exported functions --------------------------------------------------------*/

/* 初始化函数 */
void tim_cap_init(uint16_t arr, uint16_t psc);          /* 输入捕获初始化 */
void tim_cap_deinit(void);                              /* 输入捕获反初始化 */

/* 控制函数 */
void tim_cap_start(void);                               /* 启动输入捕获 */
void tim_cap_stop(void);                                /* 停止输入捕获 */

/* 数据获取函数 */
uint32_t tim_cap_get_frequency(void);                   /* 获取频率（Hz） */
uint32_t tim_cap_get_duty(void);                        /* 获取占空比（0-10000） */
uint32_t tim_cap_get_period(void);                      /* 获取周期（计数值） */
void tim_cap_get_data(TIM_CAP_Data_t *data);            /* 获取完整数据 */

/* 回调函数注册 */
void tim_cap_register_callback(void (*callback)(TIM_CAP_Data_t *data)); /* 注册捕获完成回调 */

/* 中断处理函数（由HAL库调用） */
void tim_cap_irq_handler(void);                         /* 捕获中断处理 */
void tim_cap_overflow_handler(void);                    /* 定时器溢出中断处理 */

#ifdef __cplusplus
}
#endif

#endif /* __BSP_TIM_CAPTURE_H */
